


const targetMap = new WeakMap();
let activeEffect: any = null;

/**
 * 监听目标数据变化
 * @param target 
 * @param key 
 */
function track(target: any, key: string | symbol): void {

  let depsMap = targetMap.get(target);   // 获取target对象的依赖映射表
  // 如果不存在，则创建一个新的映射表
  if (!depsMap) {
    depsMap = new Map();
    targetMap.set(target, depsMap);
  }
  let dep = depsMap.get(key);       // 获取key对应的依赖集合
  // 如果不存在，则创建一个新的依赖集合
  if (!dep) {
    dep = new Set();
    depsMap.set(key, dep);
  }
  // 将当前的 activeEffect 添加到依赖集合中
  dep.add(activeEffect);
}

/**
 * 监听目标数据变化
 * @param target 
 * @param key 
 * @returns 
 */
function trigger(target: any, key: string | symbol) {
  const depsMap = targetMap.get(target);  // 获取target对象的依赖映射表
  // 如果不存在，则直接返回
  if (!depsMap) { return; }
  const dep = depsMap.get(key);      // 获取key对应的依赖集合
  // 如果存在依赖集合，则遍历依赖集合中的所有effect函数并执行
  if (dep) {
    dep.forEach((effect: any) => {
      effect();
    });
  }
}

export {
  track,
  trigger
}